// #include <map>
// #include <iostream>
// #include <algorithm>
// using namespace std;
// int n, m;
// #define MAX_N 100
// int ski_resort[MAX_N + 5][MAX_N + 5];
// int dp[MAX_N + 5][MAX_N + 5] = {0};
// int dx[4] = {1, -1, 0, 0};
// int dy[4] = {0, 0, 1, -1};

// multimap<int, pair<int,int>> points;
// int main()
// {
//     cin >> n >> m;
//     for(int i = 0; i < n; i++)
//     {
//         for(int j = 0; j < m; j++)
//         {
//             cin >> ski_resort[i][j];
//             points.insert({ski_resort[i][j], {i, j}});
//         }
//     }
//     //算出最后的长度要加一，因为算的是移动的次数
//     for(auto it : points)
//     {
//         int _x = it.second.first;
//         int _y = it.second.second;
//         int val = it.first;
//         for(int k = 0; k < 4; k++)
//         {
//             int x = _x + dx[k], y = _y + dy[k];
//             if(x < 0 || x >= n || y < 0 || y >= m) continue;
//             if(ski_resort[_x][_y] < ski_resort[x][y]) dp[x][y] = max(dp[x][y], dp[_x][_y] + 1);
//         }
//     }
//     int max = 0;
//     for(int i = 0; i < n; i++)
//     {
//         for(int j = 0; j < m; j++)
//         {
//             if(dp[i][j] > max) max = dp[i][j];
//         }
//     }
//     for(int i = 0; i < n; i++)
//     {
//         for(int j = 0; j < m; j++)
//         {
//             cout << dp[i][j] << " " ;
//         }
//         cout << endl;
//     }
//     cout << max + 1;
//     return 0;
// }

#include <iostream>
#include <cstring>
using namespace std;

int n, m;
#define MAX_N 100
int memo[MAX_N + 5][MAX_N + 5] = {0};
int ski_resort[MAX_N + 5][MAX_N + 5];
int ret = 0;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};

int dfs(int _x, int _y)
{
    if (memo[_x][_y] != -1)
        return memo[_x][_y];
    int len = 1;
    for (int k = 0; k < 4; k++)
    {
        // int x = dx[k] + _x, y = dy[k] + _y;
        // if(x < 0 || x >= n || y < 0 || y >= m) continue;
        // if(ski_resort[_x][_y] < ski_resort[x][y]) continue;
        // len = max(len, 1 + dfs(x, y));

        //         提前检查边界，避免不必要的函数调用
        // if (x >= 0 && x < n && y >= 0 && y < m &&
        //     ski_resort[_x][_y] > ski_resort[x][y]) {
        //     len = max(len, dfs(x, y) + 1);
        // }
        int x = dx[k] + _x, y = dy[k] + _y;
        if (x < 0 || x >= n || y < 0 || y >= m || ski_resort[_x][_y] <= ski_resort[x][y])
            continue;
        len = max(len, 1 + dfs(x, y));

    }
    memo[_x][_y] = len;
    return len;
}

int main()
{
    memset(memo, -1, sizeof(memo));
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> ski_resort[i][j];
        }
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            ret = max(ret, dfs(i, j));
        }
    }
    cout << ret;
    return 0;
}